New configuration variable $wgShowPageOnRedlink that can be set to show the page...
authorTobias <churchofemacs@users.mediawiki.org>
Mon, 21 Sep 2009 19:21:12 +0000 (19:21 +0000)
committerTobias <churchofemacs@users.mediawiki.org>
Mon, 21 Sep 2009 19:21:12 +0000 (19:21 +0000)
RELEASE-NOTES
includes/DefaultSettings.php
includes/EditPage.php

index 0395464..c96dd68 100644 (file)
@@ -239,6 +239,9 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
   the root permission effectively grants all other permissions on a wiki.  Useful
   for debugging and administration.
 * (bug 16979) Tracking categories for __INDEX__ and __NOINDEX__
+* New configuration variable $wgShowPageOnRedlink that can be set to show the page
+  instead of an edit interface when visiting a red link. The value can be specified
+  for specific usergroups and namespaces.
 
 === Bug fixes in 1.16 ===
 
index fa30f3e..843cafc 100644 (file)
@@ -4269,3 +4269,16 @@ $wgUploadMaintenance = false;
  * Use old names for change_tags indices.
  */
 $wgOldChangeTagsIndex = false;
+
+/**
+ * View page instead of edit interface when visiting a red link
+ * There are three ways to define this variable:
+ *  1. Set $wgShowPageOnRedlink to true (false is default)
+ *  2. Set $wgShowPageOnRedlink['usergroup'] to false. If a user is member of at least one usergroup for which the variable 
+ *     has been set to false, the edit interface will be shown. Otherwise the page is shown.
+ *  3. Set $wgShowPageOnRedlink['usergroup'][NS_XY] to false. Same as 2., but you can specify the namespace. The namespace
+ *     is a numerical value (namespace index), you can use constants such as NS_MAIN or NS_USER_TALK.
+ * If you use an array (2. or 3.), the default will be true (for 1. it's false). In 2. and 3. there is no way to overwrite 
+ * a value 'false' once it has already been set (this is due to the undefined order of usergroups).
+ */
+$wgShowPageOnRedlink = false;
index 5709a98..794072c 100644 (file)
@@ -418,11 +418,11 @@ class EditPage {
                                }
                        }
                }
-               
-               // If they used redlink=1 and the page exists, redirect to the main article
-               if ( $wgRequest->getBool( 'redlink' ) && $this->mTitle->exists() ) {
-                       $wgOut->redirect( $this->mTitle->getFullURL() );
-               }
+
+               # Evaluate if the edit interface should be shown or
+               # if the page should be shown, in case redlink=true
+               if ( $wgRequest->getBool( 'redlink' ) )
+                       $this->showPageOnRedlink();
 
                wfProfileIn( __METHOD__."-business-end" );
 
@@ -487,7 +487,45 @@ class EditPage {
                wfProfileOut( __METHOD__."-business-end" );
                wfProfileOut( __METHOD__ );
        }
-       
+
+       /*
+        * Evaluate if the edit interface should be shown or the page, in case redlink=true. 
+        * If the page exists, it is always shown. If it doesn't, it depends on the settings 
+        * of $wgShowPageOnRedlink (see DefaultSettings for documentation).
+        */
+       protected function showPageOnRedlink() {
+               global $wgShowPageOnRedlink, $wgUser, $wgRequest, $wgOut;
+               $redirectToPage = false;
+               # If the page exists (it has been created after the link has been emerged),
+               # redirect to the page instead of editing the current page
+               if ( $this->mTitle->exists() )
+                       $wgOut->redirect( $this->mTitle->getFullURL() );
+               # Check site configuration ($wgShowPageOnRedlink)
+               if ( is_array( $wgShowPageOnRedlink ) ) {
+                       $ns = $this->mTitle->getNamespace();
+                       $groups = $wgUser->getEffectiveGroups();
+                       # Gets overwritten if user is member of a group that has been specified:
+                       $redirectToPage = true;
+                       foreach ( $groups as $i => $group ) {
+                               # Test if there is a rule for a specific usergroup and a specific namespace
+                               if ( isset( $wgShowPageOnRedlink[$group][$ns] ) && $wgShowPageOnRedlink[$group][$ns] == false ) {
+                                       $redirectToPage = false;
+                               }
+                               # Test if there is a rule for a specific usergroup in all namespaces
+                               elseif ( isset( $wgShowPageOnRedlink[$group] ) && !is_array( $wgShowPageOnRedlink[$group] ) 
+                                          && $wgShowPageOnRedlink[$group] == false ) {
+                                       $redirectToPage = false;
+                               }
+                       }
+               }
+               else {
+                       $redirectToPage = $wgShowPageOnRedlink;
+               }
+               if ( $redirectToPage ) {
+                       $wgOut->redirect( $this->mTitle->getFullURL() );
+               }
+       }
+
        protected function getEditPermissionErrors() {
                global $wgUser;
                $permErrors = $this->mTitle->getUserPermissionsErrors( 'edit', $wgUser );